Handle migration of x86 VCPUs between physical CPUs.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Sat, 7 Jan 2006 16:52:43 +0000 (17:52 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Sat, 7 Jan 2006 16:52:43 +0000 (17:52 +0100)
If required, context_switch() must pull state off of
old CPU.

Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/domain.c

index dd79e2aad426ba1a3c562b186b0115321669d0bd..e44c79a1ddf4041d2347571e77a472649032461f 100644 (file)
@@ -749,11 +749,21 @@ void context_switch(struct vcpu *prev, struct vcpu *next)
 {
     unsigned int cpu = smp_processor_id();
 
+    ASSERT(local_irq_is_enabled());
+
     set_current(next);
 
     if ( (percpu_ctxt[cpu].curr_vcpu != next) &&
          !is_idle_domain(next->domain) )
     {
+        /* This may happen if next has been migrated by the scheduler. */
+        if ( unlikely(!cpus_empty(next->vcpu_dirty_cpumask)) )
+        {
+            ASSERT(!cpu_isset(cpu, next->vcpu_dirty_cpumask));
+            sync_vcpu_execstate(next);
+            ASSERT(cpus_empty(next->vcpu_dirty_cpumask));
+        }
+
         local_irq_disable();
         __context_switch();
         local_irq_enable();